/* This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package Modelo;
import java.util.*;

import org.jdom.Element;

/**
 * Clase abstracta que representa a una tecnica
 */
public abstract class Tecnica {

	/*conjunto de parametros que usara la tecnica*/
    /**
     * Vector conjunto de los parametros de la tecnica
     */
	public Vector<Parametro> _param;
    /**
     * Tipo de tecnica dependiendo de su clasificacion
     */
	public String _tipo_Tecnica;
    /**
     * Atributo que indica si la tecnica es instalada o no instalada
     */
	public String _tipo;//Instalado o no instalado
    /**
     * Objeto que apunta al plugin
     */
	public Plugin _plugin;
    /**
     * Conjunto de resultados de la tecnica
     */
	public Vector<Parametro> _resultados; 	
	
    /**
     * Constructor de la clase Tecnica
     */
	public Tecnica(){
	}
	
    /**
     * Constructor de la clase Tecnica
     * @param parametros Vector de parametros
     * @param plugin Plugin de la clase parametro
     */
	public Tecnica(Vector<Parametro> parametros, Plugin plugin){
			_param=parametros;
			_plugin=plugin;
		}
	
    /**
     * Metodo que devuelve el conjunto de Parametros
     * @return Conjunto de parametros de la tecnica
     */
	public Vector getParametros(){	
		return _param;
	}
	
    /**
     * Metodo que permite establecer el Vector Conjunto de parametros
     * @param parametros Conjunto de los parametros
     */
	public void setParametros(Vector<Parametro> parametros){
			_param=parametros;
			
		}
		
    /**
     * Metodo que permite anadir un parametro al conjunto de los Parametros de la tecnica
     * @param param Parametro a anadir
     */
	public void addParametro(Parametro param){
		 _param.add(param);
	
	}
	
	//Devuelve un valor por el nombre del parametro
    /**
     * Metodo que devuelve el valor de un parametro concreto
     * @param nombre Nombre del parametro del que se quiere obtener el valor
     * @return Valor del parametro concreto seleccionado
     */
	public String getValue(String nombre){
		Iterator i = _param.iterator();
		String valor="";
    	while (i.hasNext()){
    	    		Parametro e= (Parametro)i.next();
    	    		if(e.getName().compareTo(nombre)==0){
    	    			valor = e.getValue();  	    			
    	    		}
    	}
    	return valor;
	
	}
	
	//Devuelve un valor por el nombre del parametro
    /**
     * Metodo que devuelve un resultado concreto del vector de resultados
     * @return Resultado concreto solicitado
     * @param nombre nombre del resultado solicitado
     */
	public String getResultado(String nombre){
		String valor="";
		if (_resultados!=null){
		Iterator i = _resultados.iterator();	
    	while (i.hasNext()){
    	    		Parametro e= (Parametro)i.next();
    	    		if(e.getName().compareTo(nombre)==0){
    	    			valor = e.getValue();  	    			
    	    		}
    		}
    	}
    	return valor;
	}
	
    /**
     * Metodo que imprime todos los parametros de la tecnica
     */
	public void printParams(){
		Iterator i = _param.iterator();
		String valor=null;
		System.out.println("Detecta si el programa " +  _plugin.get_name() + " esta " + _tipo + ":");
    	while (i.hasNext()){
    	    		Parametro e= (Parametro)i.next();
    	    		e.printParam();
    	}
	}
	
    /**
     * Metodo que imprime todos los resultados de la Tecnica
     */
	public void printResults(){
		if(_resultados!=null){
			Iterator i = _resultados.iterator();
			String valor=null;
			if(i.hasNext()){
			System.out.println("El restultado del plugin " +  _plugin.get_name() + " ah encontrado " + _tipo + ":");
				while (i.hasNext()){
					Parametro e= (Parametro)i.next();
					e.printParam();
				}
			}
		}
	}

        /**
     * Metodo que dice si la tecnica ha sido encontrada
     */
	public boolean encontrado(){
		if(_resultados!=null){
			return !_resultados.isEmpty();
                }else{
                    return false;
                }
        }
	
    /**
     * Metodo que ejecuta la tecnica
     */
	public abstract void ejecutar(String unidad);
	
}
